import Reader from "./decode/reader.js";

export default (func_li, default_li) => {
	const li_push = [],
		map_pos_li = [];
	/*
default_li
0 单个数字/字符串
1 数组
2 纯数字的数组
3 字典
  */
	default_li.forEach((v, p) => {
		if (v == 1) {
			li_push.push(p);
		} else if (v == 3) {
			map_pos_li.push(p);
		}
	});
	const func = nodefault(func_li, li_push, map_pos_li);
	return (msg) => {
		if (msg.length) {
			let li;
			if (msg.length === 1) {
				li = [];
			} else {
				li = func(msg);
			}
			default_li.forEach((v, p) => {
				if (p in li) {
					if (li[p] === undefined) {
						li[p] = v;
					}
				} else {
					if (li_push.includes(p)) {
						v = [];
					}
					li[p] = v;
				}
			});
			return li;
		}
	};
};

export const li = (func) => (msg) => {
	if (msg.length) {
		const r = [];
		if (msg.length > 1) {
			for (const i of Reader(msg)) {
				r.push(func(i[1].data));
			}
		}
		return r;
	}
};

export const nodefault =
	(func_li, li_push, map_pos_li = []) =>
	(msg) => {
		if (msg.length) {
			let o,
				n,
				data,
				li = [];
			for (n of li_push) {
				li[n] = [];
			}
			for (n of map_pos_li) {
				li[n] = {};
			}
			if (msg.length > 1) {
				for ([n, { data }] of Reader(msg)) {
					const f = func_li[--n];
					if (map_pos_li.includes(n)) {
						f(li[n], data);
					} else {
						o = f(data);
						if (li_push.includes(n)) {
							li[n].push(o);
						} else {
							li[n] = o;
						}
					}
				}
			}
			return li;
		}
	};

export const kv = (dKey, d_key, dVal, d_val) => (r, bin) => {
	let key = d_key;
	for (const [kind, { data }] of Reader(bin)) {
		if (kind - 1) {
			// val
			r[key] = dVal(data);
			return;
		}
		key = dKey(data);
	}
	r[key] = d_val;
};

export const map = (dKey, d_key, dVal, d_val) => {
	const _kv = kv(dKey, d_key, dVal, d_val);
	return (bin) => {
		const r = {};
		for (const [_, { data }] of Reader(bin)) {
			_kv(r, data);
		}
		return r;
	};
};
